package com.wsz.security.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.OrRequestMatcher;

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()//开启请求权限管理
            .mvcMatchers("/index")/*匹配请求*/.permitAll()// 所有请求    放行index所以请求
            .mvcMatchers("/login.html")/*匹配请求*/.permitAll()// 所有请求    放行login.html所以请求
//            .mvcMatchers("/hello").authenticated()                  hello请求需要认证
            .anyRequest().authenticated()//                           所有请求都要认证从上到下按顺序执行放行资源写前面
            .and()//                                                  返回HttpSecurity http
            .formLogin()//                                           需要表单认证
            .loginPage("/login.html")//                              表单页面所在的地址   一旦自定义登录界面后必须指定登录的url
            .loginProcessingUrl("/login")//                          指定处理登录请求url
            .usernameParameter("username")//                         指定用户名
            .passwordParameter("password")//                         指定密码
//            .successForwardUrl("/hello")                         认证成功后forward的页面   转url
//            .defaultSuccessUrl("/hello")                         认证成功之后redirect跳转  根据上次保存的请求进行成功跳转 没有则跳url     true   始终跳url    false   默认
            .successHandler(new AuthenticationSuccessConfig())//     前后端分离时 认证成功后跳转
//            .failureForwardUrl("/login.html")                      认证失败后forward的页面   转url  放request
//            .failureUrl("/login。html")                            认证失败后redirect的页面   转url 放session
            .failureHandler(new AuthenticationFailConfig())//                                      前后端分离时 认证成功后跳转
            .and()
            .logout()//开启注销配置
//            .logoutUrl("/logout")指定注销的url   请求方式默认为GET
                .logoutRequestMatcher(new OrRequestMatcher(
                        new AntPathRequestMatcher("/aa","GET"),
                        new AntPathRequestMatcher("/bb","POST")
                )) //
                .invalidateHttpSession(true)//会话失效 默认开启
                .clearAuthentication(true)//清空认证标记
//                .logoutSuccessUrl("/login.html")//注销的登录后跳转的页面
                .logoutSuccessHandler(new LogoutSuccessHandlerConfig())
                .and()
            .csrf().disable();//                                    禁止csrf跨站保护
    }
}
